﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Prisa.DataAccess;
using Prisa.Entities;
using Microsoft.Practices.Unity;

namespace Prisa.BussinesLogic
{
    public class ClienteBL : IClienteBL
    {
        [Dependency]
        public IClienteDAO clienteDAO { get; set; }
        [Dependency]
        public IVentaDAO ventaDAO { get; set; }
        [Dependency]
        public ICreditoDAO creditoDAO { get; set; }

        public ClienteBL()
        { }

        public List<CLIENTE> GetAllFromCliente()
        {
            return clienteDAO.GetAllFromCliente();
        }

        public List<CLIENTE> GetFromClienteByCriterio(string criterio)
        {
            return clienteDAO.GetFromClienteByCriterio(criterio);
        }

        public CLIENTE GetFromOneClienteByDniRuc(string DniRuc)
        {
            return clienteDAO.GetFromOneClienteByDniRuc(DniRuc);
        }

        public void AddCliente(CLIENTE cliente)
        {
            var duplicidad = clienteDAO.ExisteDuplicidadDniRucAndRazonSocial(cliente.DniRuc,cliente.NombreRazonSocial, cliente.Id);

            if (!duplicidad)
            {
                var msg = "";
                var ok = cliente.Validate(out msg);
                if (ok)
                {
                    clienteDAO.AddCliente(cliente);
                }
                else
                {
                    throw new Exception(msg);
                }
            }
            else
            {
                var error = string.Format("Ya existe un Cliente con la misma información\n" +
                    "DNI/RUC: " + cliente.DniRuc + "\nRazon Social: " + cliente.NombreRazonSocial);
                throw new Exception(error);
            }
            
        }

        public void UpdateCliente(CLIENTE cliente)
        {
            var duplicidad = clienteDAO.ExisteDuplicidadDniRucAndRazonSocial(cliente.DniRuc, cliente.NombreRazonSocial, cliente.Id);
            var clienteDefault = clienteDAO.GetFromOneClienteByDniRuc("00000000");
            if (cliente.Id != clienteDefault.Id)
            {
                if (!duplicidad)
                {
                    var msg = "";
                    var ok = cliente.Validate(out msg);
                    if (ok)
                    {
                        clienteDAO.UpdateCliente(cliente);
                    }
                    else
                    {
                        throw new Exception(msg);
                    }
                }
                else
                {
                    var error = string.Format("Ya existe un Cliente con la misma información\n" +
                        "DNI/RUC: " + cliente.DniRuc + "\nRazon Social: " + cliente.NombreRazonSocial);
                    throw new Exception(error);
                }
            }
            else
            {
                var error = string.Format("No se puede modificar los datos del cliente por defecto\n");
                throw new Exception(error);
            }
            
        }

        public void DeleteCliente(int id)
        {
            var hijosVenta = ventaDAO.GetAllVentasByImpuestoIdOrClienteId(0, id);
            var hijosCredito = creditoDAO.GetAllCreditosByClienteId(id);

            if (hijosVenta == true || hijosCredito == true)
            {
                var error = string.Format("No se puede eliminar el Cliente ");
                throw new Exception(error);
            }
            else
            {
                clienteDAO.DeleteCliente(id);
            }
        }


        public CLIENTE GetFromClienteById(int id)
        {
            return clienteDAO.GetFromClienteById(id);
        }


        public bool ExisteDuplicidadDniRucAndRazonSocial(string dniRuc, string razonSocial, int id)
        {
            return clienteDAO.ExisteDuplicidadDniRucAndRazonSocial(dniRuc, razonSocial, id);
        }
    }
}
